package com.thread.threadfirst.studyThread1;

import java.util.concurrent.TimeUnit;

/**
 * 15、不要以字符串常量作为锁定对象。
 * 在下面例子中m1和m2锁定的是同一个对象。
 * 这种情况就会造成诡异的现象，比如你用到了一个类库，在该类库中（就比如jetty）代码锁定了字符串“Hello”，而不读不到源码，
 * 你碰巧在自己的代码中也锁定了“Hello”，这时候就造成了死锁，因为你用到的类库和你的程序不经意使用了同一把锁。
 */
public class T7 {
    String s1 = "Hello";
    String s2 = "Hello";

    void m1() {
        synchronized (s1) {
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            }
        }
    }

    void m2() {
        synchronized (s2) {
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            }
        }
    }

    public static void main(String[] args) {
        T7 t7 = new T7();
        new Thread(() -> t7.m1(), "t1").start();
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //验证t2是否可以得到锁，不能则代表字符串值相等的 在内存中只会有一个内存地址
        new Thread(() -> t7.m2(), "t2").start();
    }
}
